home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / comm / misc / Sashi89.lha / Sashi89 / sources / packet.c < prev    next >
C/C++ Source or Header  |  2001-05-05  |  3KB  |  162 lines

  1.  
  2. /* ANSI */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <ctype.h>
  6.  
  7. /* Amiga */
  8. #include <exec/types.h>
  9.  
  10. #include "packet.h"
  11. #include "hard.h"
  12.  
  13.  
  14. int ti_sendpacket(Packet *packet)
  15. {
  16.   unsigned int cpt;
  17.   WORD checksum=0;
  18.  
  19.   if ( ti_sendbyte(0x08) )
  20.     return(PACKET_ERROR);
  21.   if ( ti_sendbyte(packet->command) )
  22.     return(PACKET_ERROR);
  23.   if ( ti_sendbyte(packet->nb&0xFF) )
  24.     return(PACKET_ERROR);
  25.   if ( ti_sendbyte(packet->nb>>8) )
  26.     return(PACKET_ERROR);
  27.  
  28.   if ( packet->command != COMMAND_WAITING )
  29.   for ( cpt=1; cpt<=packet->nb; cpt++)
  30.   {
  31.     if ( ti_sendbyte(packet->bytes[cpt-1]) )
  32.       return(PACKET_ERROR);
  33.     checksum += packet->bytes[cpt-1];
  34.   }
  35.  
  36.   if ( packet->command != COMMAND_WAITING )
  37.   if ( packet->nb )
  38.   {
  39.     if ( ti_sendbyte(checksum&0xFF) )
  40.       return(PACKET_ERROR);
  41.     if ( ti_sendbyte((checksum>>8)&0xFF) )
  42.       return(PACKET_ERROR);
  43.   }
  44.  
  45.   return(0);
  46. }
  47.  
  48. int ti_getpacket(Packet *packet)
  49. {
  50.   UBYTE temp;
  51.  
  52.   if ( ti_recvbyte(&temp) || temp != 0x98 )
  53.     return(PACKET_ERROR);
  54.  
  55.  
  56.   if ( ti_recvbyte(&packet->command) )
  57.     return(PACKET_ERROR);
  58.  
  59.   {
  60.     unsigned int nb;
  61.     if ( ti_recvbyte(&temp) )
  62.       return(PACKET_ERROR);
  63.  
  64.     nb=temp;
  65.  
  66.     if ( ti_recvbyte(&temp) )
  67.       return(PACKET_ERROR);
  68.  
  69.     nb += (temp << 8);
  70.  
  71.     if ( nb > packet->max ) /* Not enough memory, realloc */
  72.       if ( ti_allocpacket(packet,nb) )
  73.         return(PACKET_ERROR);
  74.  
  75.     packet->nb = nb;
  76.   }
  77.  
  78.  
  79.   if ( packet->nb && packet->command != COMMAND_OK)
  80.   {
  81.     unsigned int cpt;
  82.     unsigned short int checksum=0;
  83.     unsigned short int recv_checksum;
  84.  
  85.     for ( cpt=0; cpt<packet->nb; cpt++ )
  86.     {
  87.       if ( ti_recvbyte(&packet->bytes[cpt]) )
  88.         return(PACKET_ERROR);
  89.       checksum += packet->bytes[cpt];
  90.     }
  91.  
  92.     ti_recvbyte(&temp);
  93.     recv_checksum = temp;
  94.  
  95.     ti_recvbyte(&temp);
  96.     recv_checksum += temp<<8;
  97.  
  98.  
  99.     if ( recv_checksum != checksum )
  100.     {
  101.       printf("Error : checksum %x!=%x\n",recv_checksum,checksum);
  102.       return(PACKET_ERROR);
  103.     }
  104.  
  105.     packet->checksum = checksum;
  106.   }
  107.  
  108.  
  109.   return(0);
  110. }
  111.  
  112. int ti_cp2packet(Packet *packet, int nb, UBYTE *bytes)
  113. {
  114.   unsigned int cpt;
  115.   if ( (unsigned int)nb > packet->max )
  116.     if ( ti_allocpacket(packet,nb) )
  117.       return(PACKET_ERROR);
  118.  
  119.   for ( cpt=0; cpt<(unsigned int)nb ; cpt ++ )
  120.     packet->bytes[cpt] = bytes[cpt];
  121.  
  122.   packet->nb = nb;
  123.  
  124.   return(0);
  125.  
  126. }
  127.  
  128. void ti_initpacket(Packet *packet)
  129. {
  130.   packet->max = 0;
  131.   packet->nb  = 0;
  132.   packet->bytes = NULL;
  133. }
  134.  
  135. int ti_allocpacket(Packet *packet, int nb)
  136. {
  137.   ti_freepacket(packet);
  138.  
  139.   packet->bytes = calloc(nb,sizeof(UBYTE));
  140.  
  141.   if ( ! packet->bytes && nb )
  142.   {
  143.     packet->max = 0;
  144.     packet->nb  = 0;
  145.     return(PACKET_ERROR);
  146.   }
  147.  
  148.   packet->max = nb;
  149.   return(0);
  150. }
  151.  
  152.  
  153. void ti_freepacket(Packet *packet )
  154. {
  155.   if ( packet->bytes && packet->max)
  156.     free(packet->bytes );
  157.   packet->bytes = NULL;
  158.   packet->nb  = 0 ;
  159.   packet->max = 0 ;
  160. }
  161.  
  162.